今天來學習一下第一名和第三名包山包海的 ensemble 大法。
第一名的解法不愧是第一名,他們真的花好多 effort 在解這個賽題,我非常 respect!
我願稱他們的解法為--超級 ensemble 體。
從擴增資料集的創建,到模型的集成,他們收集多種來源、多種演算法來創造這個巨大的複合體,我們先從資料集創建開始講~
在擴增訓練資料集方面,他們也是受到昨天 deberta-v3
泛化性實驗的啟發,決定建立一個包含多種來源的超多樣人類/AI文章集。
我們可以分資料來源和生成方法來個面向來介紹。
模型選擇
為了讓模型學會 LLM 生成文章中 general 的 feature,他們使用閉源模型,如:GPT-3.5、GPT-4、Claude、Cohere、Gemini、PaLM,以及開源模型,如:LLaMA、Falcon、Mistral、Mixtral,還有經過一些 instruction tuning 或是其他 pretraining 的開源模型,一起生成一個龐大的LLM文章集。
生成配置
在用 LLM 生成的時候,他們還嘗試各式各樣 decode strategy 以及配置,如對比搜索(contrastive search)、指導尺度(guidance scale)、typical_p、抑制特定詞彙(suppress_tokens)、高溫度(high temperature)與大top-k值、填空提示(隨機遮蔽作文中的詞彙,並讓LLM重建原文,類似於掩碼語言模型(MLM))、有無文本來源提示生成、提示模型重寫現有作文等等。
並且為了讓 LLM 生成的文章比較像學生寫錯字,或是 Host 根據某種規則插入特殊符號偽裝成打錯字的樣子,他們透過在LLM生成的文本進行刪除/插入/交換字符、同義詞替換、回譯(back translation)、隨機大小寫轉換、交換句子順序等方式增加 noise。
就...工作量滿大的。
在集成模型方面,他們也是下了苦功。他們盡可能採用不同架構、不同 pretrained 的模型,甚至還加入一些 unsupervised、基於 n-gram 的 feature 等等,來避免模型 overfitting 的問題。
他們一共集成下面這些模型與方法:
前兩個應該不太需要介紹,總之就是用他們擴建的訓練集訓練 Decoder-only 架構的 Mistra-7B ,以及 encoder-only 架構的 deberta-v3
,在訓練 deberta-v3 的時候還創造三種變體:一種是簡單做 binary classification,另一種是在自己的 train/test dataset 上訓練 tokenizer(詳細作法與原因,請參考[Day 27]照妖(AI)鏡下的秘密-利用TF-IDF、BPE編碼、Kmeans Cluster和DetectGPT技術區分人類與AI寫作);第三種則是訓練模型做 ranking,就是把 loss 從計算 cross entropy 改成計算 MSE loss。
比較需要介紹的應該是後面兩種:
Ghostbuster
Ghostbuster(捉鬼人)出自2023年的一篇paper----
Ghostbuster: Detecting Text Ghostwritten by Large Language Models,這篇論文提出一個名為 Ghostbuster 的新方法,用來偵測 AI 生成的文本,並且比現有的方法(例如 DetectGPT 和 GPTZero)在多種情況下表現更好。關鍵是 Ghostbuster 不需要知道生成文本的目標模型的 token 機率,因此可以用來偵測來自黑箱或未知模型的 AI 文本。
Ghostbuster 的方法分為三個主要步驟:
獲取機率:文本先經過多個較弱的語言模型(例如 unigram 模型、Kneser-Ney trigram 模型、GPT-3 中的非指令微調模型 ada 和 davinci)來計算每個 token 的機率。
特徵選擇:根據「事先定義」好的不同的向量和標量函數來組合這些機率,這些函數能將機率轉換成特徵。舉例來說,可以計算出 unigram 和 GPT-3 ada 模型之間的機率差異,或是計算機率的平均值、方差等。
這邊他們是先定義好的 scaler function 和 vector function 有下面這些:
訓練分類器:最終會將選出來的特徵送入一個線性分類器(例如邏輯回歸模型)進行訓練。這個分類器會學習如何根據這些特徵區分文本是由人類還是 AI 所生成。
首先你可能會好奇:
接下來,你可能會繼續問:
好吧,用 token 的機率分佈就用吧,那為什麼還要把他們組合起來加加減減、計算平均值、變異數這些呢?就直接把機率分佈當作特徵送給分類器不行嗎?
其實我個人認為,這是因為他們選用的分類器是非常簡單的 Logistic
Regression Classifier 所以才要額外做這些事情。
所以也許我們先來猜測一下他們為什麼要用 Logistic Regression Classifier?
Logistic Regression Classifier是一個相對簡單且線性的模型,但它具備幾個重要的優勢,特別是在這種特徵組合和選擇的框架下:
首先它的解釋性很強,能夠清晰地解釋每個特徵對分類結果的貢獻。它的模型權重可以直接反映每個特徵的重要性和影響力。在他們的框架中,我們需要在前期從大量的特徵組合中,找到對分類最有用的特徵,而Logistic Regression非常適合結合前向選擇(Forward Selection)進行特徵篩選。由於每個特徵對分類結果的影響是線性的,前向選擇可以逐步篩選出對分類最有用的特徵,這種方法簡單有效。
再來一點就是,Logistic Regression是一個相對簡單的模型,它的線性性質使其不容易過擬合。Ghostbuster 的設計考量之一就是要避免複雜模型在不同文本域(domain)間的表現崩潰,尤其是當數據集風格變化較大時,過於複雜的模型可能會適應過度,導致泛化能力差。相比於深度神經網絡等更複雜的模型,邏輯回歸在這方面表現得更穩定。
所以我個人認為,應該是因為logistic regression解釋性很強適合特徵篩選,以及不容易Overfitting在訓練資料集上,使得他們的方法在分類沒看過的 LLM 模型或是不同領域的文本,也可以有不錯的泛化能力,所以他們才會採用這個方案。
那既然要用簡單的分類器,我們在特徵工程上就要花心思了。
不同模型對同一個 token 的機率輸出之間可能存在複雜的關係,這些關係往往不是簡單的線性加權能夠捕捉的。通過組合機率(例如相加、相減、取最大值等),這些操作能夠生成具有非線性特徵的輸出,更有效地區分 AI 和人類生成的文本。例如,AI 生成的文本可能在某些特定詞彙或上下文結構中表現出一致性,這種一致性可能需要通過特徵組合來揭示。
如果我們選擇 deep learning model 當作 classifier,應該就不用做這些特徵組合,直接把機率分佈 concatenate 起來全部送到模型就好了。不過深度神經網路也會有一些issue就是了,我們要在這之間做取捨,也要考慮前面設計框架的特性。
Ahmet’s Unsupervised Approach
這個 unsupervised 的作法其實就是利用[Day 27]照妖(AI)鏡下的秘密-利用TF-IDF、BPE編碼、Kmeans Cluster和DetectGPT技術區分人類與AI寫作有介紹過的觀察:相似的文本往往有相同的來源。
所以我們可以計算當前要測試的文本,和資料庫中所有文本的相似度,看最相似的那幾篇是來自人類還是 AI,來決定當前的文章比較有可能是出自誰手。
第一名就是用這種超級 ensemble 的方式,集成多樣化的資料,以及多樣化的模型架構、訓練方法,包含 supervised 和 unsupervised 的不同方法,最後在 Private LB 上取得 0.9878 的高分!不過他們的作法在 Public Score board 上只取得第九名的成績~
第三名的作法也是一個超級 ensemble 體,他們結合 deep learning model 如 encoder-only 架構的 deberta-V3
,以及TF-IDF Pipeline 。我們逐一來介紹:
首先先介紹一下他們使用的訓練數據集:
他們的訓練數據來自一份參賽者所做的包含五十萬篇文章的 dataset,其中一部分是來自人類所寫,大部分是來自不同 LLM 續寫而成的文章。如果好奇這個資料集的製作方式,可以參考這篇:[Day 28]不講武德的Host-不能太倚賴錯字率,一起看第二名「復刻米其林三星料理式」的資料擴增法,與「雞蛋放兩籃」的 ensemble 思路。
另外他們還使用了由不同 LLM(大型語言模型)生成的 11,000 篇經過挑選的文章,這些文章包含:由 LLM 生成的完整文章,以及LLM對文章進行句子級別或部分重寫的文章。
前者是完全由 LLM 書寫的,後者則是在人類寫的文章中,替換一些 LLM 生成的句子,所以後者會是比較難判斷到底出自誰手的 hard example。
在開始介紹第三名團隊的詳細做法前,我想先介紹一下 curriculum learning。
課程學習 (curriculum learning)
不知道大家小時候有沒有被大人說過:「還不會走,就想飛!」呢?
這句話本來是在說一個好高騖遠,急著做和現在能力不匹配的事情。
我們從小學習東西都是從淺到深,不會在小朋友還不會九九乘法表的時候,就開始教微積分。但是如果我們把神經網路比喻成人類的大腦的話,由於訓練數據是隨機呈現的,一個 batch 裡面可能同時會有簡單和困難的樣本,那就好像逼迫模型在一堂課裡面,要從一個數學小白同時學會 1+1=2 以及函數的微分一樣。
聽起來很荒唐吧? 我們的課綱不會這樣安排,那為何訓練模型要這樣設計呢?
這就是 curriculum learning 當初被提出來的原因。
這種「課程學習訓練方法」其實是一種模仿人類學習過程的機器學習方法,其核心思想是讓模型按照從簡單到複雜的順序學習數據。這與人類在學習新知識時,先掌握基礎概念,然後逐漸學習更複雜的主題的過程相似。在相關論文的實驗中,研究學者發現方法可以幫助模型更有效地學習,並且通常能夠提高模型的泛化能力和收斂速度。
(👆🏻圖片來源)
但還是得提一下,也不一定在各個領域上使用 curriculum learning 都有顯著的效果,畢竟神經網路也不是真的就和人類大腦一樣,完全用人類學習的方式和路徑套到模型上也不一定會和人類有一樣的學習效果。
講完這個訓練方法的直覺和大概的構想了,我們來介紹一下在訓練模型時具體可以怎麼運用 Curriculum Learning:
文字分類任務: 假設要訓練一個模型來區分不同的新聞類型。可以首先讓模型學習一些非常典型的樣本,例如長度較短且內容明確的新聞標題,這些樣本的分類相對簡單。隨著訓練的進行,再讓模型學習內容更長、更混雜的新聞文章,這些樣本可能涉及多個主題,對模型來說分類難度較大。
圖像分類任務: 在圖像分類中,如果要讓模型學習區分不同動物的圖片,可以先讓模型學習一些清晰、背景簡單的動物圖像,這些圖像容易識別。隨著模型逐漸掌握了基本的動物特徵,再讓它學習一些背景較為複雜或者動物姿態不同的圖片,這樣可以使模型的識別能力更強。
強化學習中的應用: 在強化學習中,Curriculum Learning 也經常被用來讓智能體(agent)在簡單的環境下學習基本技能。例如,在讓智能體學習玩一個複雜遊戲之前,先讓它在簡單的環境中學習基礎動作。當智能體掌握了基礎技能後,再逐步增加環境的複雜度,這樣可以幫助智能體更快速地學習並適應挑戰。
回到第三名的作法,他們使用 Curriculum learning 的方式,讓模型逐步學習那些很難被分辨的 example。
因為很難視覺話文本的"hard example",所以我這邊用圖片來替代文本,但是這邊其實是在做文本分類任務,不是圖像分類任務喔。
中間加入一些又像狗又像貓的圖片,就是想表達這次賽題中難以區分是 AI 還是人類寫的 hard example。
總之,他們用curruculum learning 的方式訓練 deberta-v3
分類模型。
除了這種 deep learning based 的模型,他們還使用了 TF-IDF 管道 進行了模型的訓練和優化,具體包括以下調整:
這些調整使得public LB保持不變,但private LB從 0.893 提升到了 0.927。
最終,第三名的團隊使用了加權平均集成來結合上面這些模型的預測結果,分兩個步驟:
今天介紹的第一名和第三名的作法,都是在 data 和 model 上花很多心思設計不同變體,最後找一個合適的 ensemble 策略將不同模型的預測結果結合起來。
但對我而言,我會覺得這兩者的作法有點難 follow。
工作量很大先不說,有時候會不太清楚為什麼他們要這樣做、使用這種作法的動機和產生的效果到底有多大。
舉例來說,第三名為什麼要使用這種 condition ensemble 的方法?為什麼又要讓 initial stage 訓練出來的模型單獨預測一次?我想這些應該都是他們在多次實驗後找到能提升 LB score 的方法,但這些經驗未必能順利移植到其他專案。
所以我個人還是比較喜歡昨天介紹第二名的作法,每次選用什麼模型、做什麼操作都有很清楚的意圖,也能從 LB score 回去驗證他的假設;另外可能因為第二名的團隊只有一個人,整體的工作量在前幾名中也是最小的,比較容易 follow 他的作法。
謝謝讀到最後的你,希望你會覺得有趣!
如果喜歡這系列,別忘了按下訂閱,才不會錯過最新更新,也可以按讚⭐️給我鼓勵唷!
如果有任何回饋和建議,歡迎在留言區和我說✨✨
(LLM - Detect AI Generated Text 解法分享系列)